package com.docker.core.mvc.validator;

import com.docker.core.render.CaptchRender;
import com.docker.sys.dic.DicRedis;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import com.jfinal.validate.Validator;
import kit.docker.exception.BaseException;
import kit.docker.validator.ValidatorKit;
import kit.docker.web.APIResCode;

public class BaseValidator extends Validator {

    @Override
    protected void validate(Controller controller) {
        setShortCircuit(true);
    }

    @Override
    protected void handleError(Controller controller) {
        throw new BaseException(APIResCode.PARAMETER_VALIDATOR_FAILED, controller.getAttrForStr("svfmsg_key"));
    }

    protected void addFailedErrorMessage(String errorMessage) {
        addError("svfmsg_key", errorMessage);
    }

    protected void validateId() {

    }

    protected void validateInput() {

    }

    protected void validateCaptcha(String keyField, String valueField, String errorMessage) {
        if (!CaptchRender.me.validate(controller.getPara(keyField), controller.getPara(valueField))) {
            addFailedErrorMessage(errorMessage);
        }
    }

    // ===================================================================================

    protected void validateString(String field, int minLen, int maxLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateString(controller.getPara(field), minLen, maxLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateCLN(String field, int minLen, int maxLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateCLN(controller.getPara(field), minLen, maxLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateLN(String field, int minLen, int maxLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateLN(controller.getPara(field), minLen, maxLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateLN(String field, int fixLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateLN(controller.getPara(field), fixLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateChinese(String field, int minLen, int maxLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateChinese(controller.getPara(field), minLen, maxLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateNumber(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateNumber(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateNumber(String field, int minLen, int maxLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateNumber(controller.getPara(field), minLen, maxLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateNumber(String field, int fixLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateNumber(controller.getPara(field), fixLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateUUID(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateUUID32(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateUUIDs(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateUUID32s(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateMobile(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateMobile(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateIP(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateIP(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validatePort(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validatePort(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateEmail(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateEmail(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateDate(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateDate(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateGroup1(String field, int minLen, int maxLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateGroup1(controller.getPara(field), minLen, maxLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateGroup2(String field, int minLen, int maxLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateGroup2(controller.getPara(field), minLen, maxLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateInteger(String field, int minNum, int maxNum, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateInteger(controller.getPara(field), minNum, maxNum, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateLong(String field, long minNum, long maxNum, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateLong(controller.getPara(field), minNum, maxNum, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateDouble(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateDouble(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateDouble(String field, double min, double max, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateDouble(controller.getPara(field), min, max, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateClassName(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateClassName(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    //Java/Android合法包名，可以包含大写字母(A到Z)、小写字母(a到z)、数字和下划线，可以用点(英文句号)分隔，隔开的每一段都必须以字母开头。
    protected void validatePackage(String field, int minLen, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validatePackage(controller.getPara(field), minLen, allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    //验证定时器时间表达式
    protected void validateCron(String field, boolean allowNull, String errorMessage) {
        if (!ValidatorKit.validateCron(controller.getPara(field), allowNull)) {
            addFailedErrorMessage(errorMessage);
        }
    }

    protected void validateDics(String field, String dicTypeCode, boolean allowNull, String errorMessage) {
        validateDics(field, dicTypeCode, ",", allowNull, errorMessage);
    }

    protected void validateDic(String field, String dicTypeCode, boolean allowNull, String errorMessage) {
        if (!(allowNull && StrKit.isBlank(controller.getPara(field)))) {
            if (StrKit.isBlank(controller.getPara(field)) || !DicRedis.vali(dicTypeCode, controller.getPara(field))) {
                addFailedErrorMessage(errorMessage);
            }
        }
    }

    protected void validateDics(String field, String dicTypeCode, String splitChart, boolean allowNull, String errorMessage) {
        if (!(allowNull && StrKit.isBlank(controller.getPara(field)))) {
            String[] codes = controller.getPara(field).split(splitChart);
            for (String code : codes) {
                if (!DicRedis.vali(dicTypeCode, code)) {
                    addFailedErrorMessage(errorMessage);
                }
            }
        }
    }


}
